using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DatabaseCode.Data;

namespace DatabaseCode
{
  public partial class DatabaseCode : Form
  {
    public DatabaseCode()
    {
      InitializeComponent();
    }
    //テキストボックスで全て選択を実行できるようにする
    //http://ukiya.sakura.ne.jp/index.php?%EF%BC%A3%EF%BC%83%E3%82%B3%E3%83%BC%E3%83%89%E6%96%AD%E7%89%87%2F%E5%85%B1%E9%80%9A%2F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A7%20CTRL%2BA%20%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B
    protected override bool ProcessDialogKey(Keys keyData)
    {
      switch (keyData)
      {
        case Keys.A | Keys.Control:
          if (this.ActiveControl is TextBox)
          {
            TextBox txt = (TextBox)this.ActiveControl;
            txt.SelectAll();
            return true;
          }
          break;
      }
      return base.ProcessDialogKey(keyData);
    }

    // リストボックスのリセット
    private void ResetManagerList()
    {
      this.listヘッダー.Items.Clear();
      foreach (D2_Header header in m_headers.Headers)
      {
        this.listヘッダー.Items.Add(header.Name);
      }
      if (this.listヘッダー.Items.Count > 0)
      {
        this.listヘッダー.SelectedIndex = 0; // 一番上の項目を選択状態にする
      }
    }

    private void Out()
    {
      Debug.ResetMessage(); // デバッグメッセージのリセット
      m_headers = new D1_Headers(this.textテーブルデザイン入力.Text);

      // リストボックスのリセット
      this.ResetManagerList();

      // 選択されているラジオボタンによって、出力内容を変更する
      if (this.radio_relationship_h.Checked)
      {
        text出力.Text = Maker.RelationshipMaker.OutHeader(m_headers);
      }
      else if (this.radio_relationship_cpp.Checked)
      {
        text出力.Text = Maker.RelationshipMaker.OutSource(m_headers);
        this.Outデバッグ();
      }
      else if (this.radio_table_graph_h.Checked)
      {
        text出力.Text = Maker.TableGraphMaker.OutHeader(m_headers);
      }
      else if (this.radio_table_graph_cpp.Checked)
      {
        text出力.Text = Maker.TableGraphMaker.OutSource(m_headers);
      }
      else if (this.radio_dataio_h.Checked)
      {
        text出力.Text = Maker.DataioMaker.OutHeader(m_headers);
      }
      else if (this.radio_dataio_cpp.Checked)
      {
        text出力.Text = Maker.DataioMaker.OutSource(m_headers);
      }
      else if (this.radio_dataio_base_h.Checked)
      {
        text出力.Text = Maker.DataioBaseMaker.OutHeader(m_headers);
      }
      else if (this.radio_dataio_base_cpp.Checked)
      {
        text出力.Text = Maker.DataioBaseMaker.OutSource(m_headers);
      }
      else if (this.radio_manager_h.Checked || this.radio_manager_cpp.Checked)
      {
        this.OutRelatedList(); // リスト関連出力
      }
    }

    // マネージャリストボックス（listヘッダー）に関連した出力
    private void OutRelatedList()
    {
      //m_headers = new D1_Headers(this.textテーブルデザイン入力.Text);
      if (this.listヘッダー.Items.Count > 0)
      {
        if (this.radio_manager_h.Checked)
        {
          text出力.Text = Maker.ManagerMaker.OutHeader(m_headers, listヘッダー.SelectedItem.ToString());
        }
        else if (this.radio_manager_cpp.Checked)
        {
          text出力.Text = Maker.ManagerMaker.OutSource(m_headers, listヘッダー.SelectedItem.ToString());
        }
        Debug.AddMessageLine("選択中のリスト項目：" + listヘッダー.SelectedItem.ToString());
        this.Outデバッグ();
      }
      else
      {
        text出力.Text = "(ヘッダー項目がありません。)";
      }
    }

    private void radio出力内容_CheckedChanged(object sender, EventArgs e)
    {
      this.Out();
    }

    private void textテーブルデザイン入力_TextChanged(object sender, EventArgs e)
    {
      this.Out();
    }

    private void radioデバッグ_階層_CheckedChanged(object sender, EventArgs e)
    {
      this.Outデバッグ();
    }

    private void radioデバッグ_メッセージ_CheckedChanged(object sender, EventArgs e)
    {
      this.Outデバッグ();
    }

    private void listヘッダー_SelectedIndexChanged(object sender, EventArgs e)
    {
      this.OutRelatedList();
    }

    private void Outデバッグ()
    {
      if (this.radioデバッグ_階層.Checked)
      {
        this.textデバッグ.Text = Debug.HierarchyString(m_headers);
      }
      else if (this.radioデバッグ_メッセージ.Checked)
      {
        this.textデバッグ.Text = Debug.Message;
      }
    }

    D1_Headers m_headers;

    private void button貼り付け_Click(object sender, EventArgs e)
    {
      this.textテーブルデザイン入力.Text = Clipboard.GetText();
      this.Out();
    }

    private void buttonコピー_Click(object sender, EventArgs e)
    {
      Clipboard.SetText(this.text出力.Text);
    }

    private void buttonサンプル_Click(object sender, EventArgs e)
    {
      this.textテーブルデザイン入力.Text = Utility.InputSampleString();
    }
  }
}
